package com.zhuiyun.project.api.article.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zhuiyun.project.api.article.entity.Article;
import com.zhuiyun.project.api.article.mapper.ArticleMapper;
import com.zhuiyun.project.api.article.model.ArticleModel;
import com.zhuiyun.project.api.article.service.ArticleService;
import com.zhuiyun.project.api.coachmanagement.entity.CoachManagement;
import com.zhuiyun.project.api.course.entity.Course;
import com.zhuiyun.project.common.errorCode.CommonException;
import com.zhuiyun.project.common.response.CommonResult;
import com.zhuiyun.project.utils.BeanUtils;
import com.zhuiyun.project.utils.StringUtils;
import com.zhuiyun.project.utils.UploadFileUtils;
import com.zhuiyun.project.utils.pageUtil.MybatisPageHelper;
import com.zhuiyun.project.utils.pageUtil.PageRequest;
import com.zhuiyun.project.utils.pageUtil.PageResult;
import com.zhuiyun.project.utils.validator.ValidatorUtil;
import io.swagger.models.auth.In;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.util.Date;
import java.util.List;

/**
 * @ClassName ArticleServiceImpl
 * @Description TODO 文章管理业务逻辑层实现类
 * @Author 杨友朋
 * @Date 2023/11/15 15:24
 **/
@Service
public class ArticleServiceImpl implements ArticleService {
    @Autowired
    private ArticleMapper articleMapper;

    /**
     * @Author 杨友朋
     * @Description 查询文章
     * @Date 2023/11/16 9:24
     * @Return PageResult
     * @param articleModel，pageRequest
     */
    @Override
    public PageResult selectArticle(ArticleModel articleModel, PageRequest pageRequest) {
        // 分页条件
        MybatisPageHelper.startPage(pageRequest);
        // 创建实体对象
        Article article=new Article();
        // 模型赋值给实体对象
        BeanUtils.copy(articleModel,article);
        // 根据实体对象条件查询文章
        List<ArticleModel> list=articleMapper.selectArticle(article);
        // 进行分页
        PageResult pageResult = MybatisPageHelper.getPageResult(list);
        return pageResult;
    }

    /**
     * @Author 杨友朋
     * @Description 单查查询文章
     * @Date 2023/11/16 9:24
     * @Return CommonResult
     * @param id
     */
    @Override
    public CommonResult selectArticleById(Integer id) {
        // 判断id是否合法
        if(id!=null&&id!=0){
            return CommonResult.ok(articleMapper.selectById(id));
        }
        return CommonResult.error("id不能为null");
    }

    /**
     * @Author 杨友朋
     * @Description 删除文章
     * @Date 2023/11/16 9:36
     * @Return CommonResult
     * @param articleIds
     */
    @Override
    public CommonResult deleteArticle(Integer articleIds) {
        // 判断id是否合法
        if(articleIds!=0&&articleIds!=null){
            // 创建实体对象
            Article article=new Article();
            // 删除标志
            article.setDelFlag("1");
            // 修改时间
            article.setUpdateTime(new Date());
            // 文章id
            article.setId(articleIds);
            // 操作数据库
            int i = articleMapper.updateById(article);
            // 判断是否操作成功
            if(i>0){
                return CommonResult.ok("删除成功");
            }else {
                return CommonResult.error("删除失败");
            }
        }
        return CommonResult.error("id不可为null");
    }

    /**
     * @Author 杨友朋
     * @Description 修改文章状态
     * @Date 2023/11/16 9:36
     * @Return CommonResult
     * @param articleModel
     */
    @Override
    public CommonResult changeArticleStatus(ArticleModel articleModel) {
        // 判断id是否合法
        if(articleModel.getId()==0||articleModel.getId()==null){
            return CommonResult.error("参数校验失败");
        }
        // 判断类型是否合法
        if(articleModel.getArticleStatus()==null||articleModel.getArticleStatus().equals("")){
            return CommonResult.error("参数校验失败");
        }
        // 创建实体对象
        Article article=new Article();
        // 模型对象赋值给实体对象
        BeanUtils.copy(articleModel,article);
        // 对数据库进行操作
        int i = articleMapper.updateById(article);
        // 判断操作是否成功
        if(i>0){
            return CommonResult.ok("操作成功");
        }
        return CommonResult.error("操作失败");
    }

    /**
     * @Author 杨友朋
     * @Description 添加文章
     * @Date 2023/11/17 13:55
     * @Return CommonResult
     * @param file,articleModel
     */
    @Transactional
    @Override
    public CommonResult addArticle(MultipartFile file, ArticleModel articleModel) throws CommonException {
        // 上传文件至服务器
        String s = UploadFileUtils.uploadFile(file);
        // 判断是否上传成功
        if(StringUtils.isEmpty(s)){
            return CommonResult.error("文件上传失败");
        }
        // 验证参数的规范性
        if(ValidatorUtil.ValidationObject(articleModel)){
            // 文件id存入模型
            articleModel.setFilePath(s);
            // 创建实体对象
            Article article=new Article();
            // 模型对象赋值给实体对象
            BeanUtils.copy(articleModel,article);
            // 创建时间
            article.setCreateTime(new Date());
            // 修改时间
            article.setUpdateTime(new Date());
            // 对数据库进行操作
            int insert = articleMapper.insert(article);
            // 判断操作是否成功
            if(insert>0){
                return CommonResult.ok("添加成功");
            }else {
                return CommonResult.error("添加失败");
            }
        }else {
            return CommonResult.error("模型参数校验失败");
        }

    }

    /**
     * @Author 杨友朋
     * @Description 修改文章
     * @Date 2023/11/17 16:47
     * @Return CommonResult
     * @param file,articleModel
     */
    @Override
    public CommonResult updateArticle(MultipartFile file, ArticleModel articleModel) throws CommonException {
        // 判断文件是否存在
        if(file!=null){
            // 上传文件至服务器
            String s = UploadFileUtils.uploadFile(file);
            // 判断操作是否成功
            if(StringUtils.isEmpty(s)){
                return CommonResult.error("文件上传失败");
            }
            // 文件id存入模型
            articleModel.setFilePath(s);
        }
        // 验证参数的规范性
        if(ValidatorUtil.ValidationObject(articleModel)){
            // 创建实体对象
            Article article=new Article();
            // 模型对象赋值给实体对象
            BeanUtils.copy(articleModel,article);
            // 修改时间
            article.setUpdateTime(new Date());
            // 对数据库进行操作
            int insert = articleMapper.updateById(article);
            // 判断操作是否成功
            if(insert>0){
                return CommonResult.ok("修改成功");
            }else {
                return CommonResult.error("修改失败");
            }
        }else {
            return CommonResult.error("模型参数校验失败");
        }
    }
}
